home *** CD-ROM | disk | FTP | other *** search
- // Copyright 1992-3 by Jon Dart. All Rights Reserved.
-
- #include "book.h"
- #include "movegen.h"
- #include "moveord.h"
- #include "util.h"
- extern "C"
- {
- #include <stdlib.h>
- #include <time.h>
- };
-
- Book::Book()
- {
- time_t t;
- srand((unsigned)time(&t));
- bookw = new Book_Reader("BOOKW");
- bookb = new Book_Reader("BOOKB");
- }
-
- Book::~Book()
- {
- delete bookb;
- delete bookw;
- }
-
- Move Book::pick( const Board &b, uint16 node_index,
- const Book_Entry &node )
- {
- Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
- unsigned total_weight = 0;
- unsigned indx = node_index;
- while (indx != INVALID)
- {
- Book_Entry be;
- reader->Fetch(indx, be);
- if (be == node)
- total_weight += be.recommend;
- indx = be.next;
- }
- if (total_weight == 0)
- return Move::NullMove();
- unsigned weight = 0;
- indx = node_index;
- while (indx != INVALID)
- {
- Book_Entry be;
- reader->Fetch(indx,be);
- if (be == node && be.recommend > 0)
- {
- weight += be.recommend;
- if ((rand()*(unsigned long)total_weight)/RAND_MAX < weight)
- // if (random(total_weight) < weight )
- {
- Move moves[Move_Generator::MaxMoves];
- Move_Generator mg( b, 0, Move::NullMove() );
- int n = mg.Generate_Moves(moves,False,True);
- assert(be.move_index < n);
- return moves[be.move_index];
- }
- }
- indx = be.next;
- }
- // should never get here
- assert(False);
- return Move::NullMove();
- }
-
- Move Book::book_move( const Board &b )
- {
- Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
- if (!reader->Is_Open())
- return Move::NullMove();
-
- unsigned indx = reader->Head(b);
- Book_Entry target(b.HashCode(),0,0,0);
- while (indx != INVALID)
- {
- Book_Entry be;
- reader->Fetch(indx,be);
- if (target == be)
- return pick(b, indx, be);
- else
- indx = be.next;
- }
- return Move::NullMove();
- }
-
- unsigned Book::book_moves( const Board &b, Move *moves,
- const unsigned limit)
- {
- Book_Reader *reader = (b.Side() == White) ? bookw : bookb;
- if (!reader->Is_Open())
- return 0;
-
- unsigned indx = reader->Head(b);
- Book_Entry target(b.HashCode(),0,0,0);
- int num_moves = 0;
- while (indx != INVALID)
- {
- Book_Entry be;
- reader->Fetch(indx,be);
- if ((target == be) && be.recommend)
- num_moves++;
- indx = be.next;
- }
- if (num_moves == 0)
- return 0;
- Move *tmp_moves = new Move[Move_Generator::MaxMoves];
- Move_Generator mg( b, 0, Move::NullMove() );
- int n = mg.Generate_Moves(tmp_moves,False,True);
- int * scores = new int[num_moves];
- Move * tmp_moves2 = new Move[num_moves];
- indx = reader->Head(b);
- num_moves = 0;
- while (indx != INVALID)
- {
- Book_Entry be;
- reader->Fetch(indx,be);
- if (target == be && be.recommend)
- {
- assert(be.move_index < n);
- tmp_moves2[num_moves] = tmp_moves[be.move_index];
- scores[num_moves] = be.recommend;
- ++num_moves;
- }
- indx = be.next;
- }
- Move_Ordering::sort_moves(tmp_moves2,scores,num_moves);
- unsigned ret_val = Util::Min(num_moves,limit);
- for (int i = 0; i < ret_val; i++)
- moves[i] = tmp_moves2[i];
- delete [] scores;
- delete [] tmp_moves;
- delete [] tmp_moves2;
- return ret_val;
- }
-